/**
 * 虽然 ECMAScript 6 类表面上看起来可以支持正式的面向对象编程，但实际上它背后使用的仍然是原型和构造函数的概念。
 */
console.log(FunctionExpression) // ReferenceError: FunctionExpression is not defined
var FunctionExpression = function () {
}
console.log(FunctionExpression) // [Function: FunctionExpression]

console.log(FunctionDeclaration);   // [Function: FunctionDeclaration]
function FunctionDeclaration() {
} // 函数声明可以提供
console.log(FunctionDeclaration);   // [Function: FunctionDeclaration]

console.log(ClassExpression); // undefined
var ClassExpression = class {
}; // 以表达式定义的类不能进行提升
console.log(ClassExpression); // [class ClassExpression]

// console.log(ClassDeclaration); // ReferenceError: ClassDeclaration is not defined
class ClassDeclaration {
}   // 类声明不能进行提升
console.log(ClassDeclaration); // class ClassDeclaration {}


/**
 * 函数受函数作用域限制，而类受块作用域限制
 */
{
    function FunctionDeclaration() {
    }

    class ClassDeclaration {
    }   // ReferenceError: ClassDeclaration is not defined
}
console.log(FunctionDeclaration); // FunctionDeclaration() {}
console.log(ClassDeclaration); // ReferenceError: ClassDeclaration is not defined

/**
 * 类表达式的名称是可选的。在把类表达式赋值给变量后，可以通过 name 属性取得类表达式的名称字符串。但不能在类表达式作用域外部访问这个标识符。
 */
;(function () {
    let Person = class PersonName {
        identify() {
            console.log(Person.name, PersonName.name);
        }
    }
    let p = new Person();
    p.identify(); // PersonName PersonName
    console.log(Person.name); // PersonName
    console.log(PersonName); // ReferenceError: PersonName is not defined
})()